package com.example.CommonMethodsOfLinkedList;

import java.util.LinkedList;
import java.util.List;
// LinkedList常用方法
public class LinkedListCompleteExample {
    public static void main(String[] args) {
        // 创建 LinkedList 实例
        LinkedList<String> studentList = new LinkedList<>();
        System.out.println("初始化的学生名单: " + studentList);
        // 输出：初始化的学生名单: []

        // 1. 使用 add(E e) 方法添加元素 - 尾插
        studentList.add("张三");  // 添加第一个学生
        studentList.add("李四");  // 添加第二个学生
        studentList.add("王五");  // 添加第三个学生
        System.out.println("添加3个学生后: " + studentList);
        // 输出：添加3个学生后: [张三, 李四, 王五]

        // 2. 使用 add(int index, E element) 在指定位置插入
        studentList.add(1, "赵六");  // 在索引1位置插入赵六
        System.out.println("在位置1插入赵六后: " + studentList);
        // 输出：在位置1插入赵六后: [张三, 赵六, 李四, 王五]

        // 3. 使用 get(int index) 获取指定位置元素
        String secondStudent = studentList.get(1);  // 获取索引1的学生
        System.out.println("第二个学生是: " + secondStudent);
        // 输出：第二个学生是: 赵六

        // 4. 使用 set(int index, E element) 修改元素
        String oldStudent = studentList.set(2, "钱七");  // 将索引2位置改为钱七
        System.out.println("被替换的学生: " + oldStudent);// 输出：被替换的学生: 李四
        System.out.println("修改后的名单: " + studentList);
        // 输出:修改后的名单: [张三, 赵六, 钱七, 王五]

        // 5. 使用 contains(Object o) 检查元素是否存在
        boolean hasZhangSan = studentList.contains("张三");
        System.out.println("是否包含张三: " + hasZhangSan);// true

        boolean hasSunBa = studentList.contains("孙八");
        System.out.println("是否包含孙八: " + hasSunBa);// false

        // 6. 使用 indexOf(Object o) 查找元素位置
        int liSiIndex = studentList.indexOf("李四");  // 查找李四的位置
        System.out.println("李四的位置: " + liSiIndex);
        // 输出：李四的位置: -1

        // 7. 添加重复元素
        studentList.add("张三");  // 再次添加张三
        System.out.println("添加重复张三后: " + studentList);
        // 输出：添加重复张三后: [张三, 赵六, 钱七, 王五, 张三]

        int firstZhangSan = studentList.indexOf("张三");  // 第一个张三位置
        int lastZhangSan = studentList.lastIndexOf("张三");  // 最后一个张三位置
        System.out.println("第一个张三位置: " + firstZhangSan);// 输出：第一个张三位置: 0
        System.out.println("最后一个张三位置: " + lastZhangSan);// 输出：最后一个张三位置: 4

        // 8. 使用 remove(int index) 按位置删除
        String removedStudent = studentList.remove(0);  // 删除第一个学生
        System.out.println("被删除的学生: " + removedStudent);// 输出：被删除的学生: 张三
        System.out.println("删除第一个学生后: " + studentList);
        // 输出：删除第一个学生后: [赵六, 钱七, 王五, 张三]

        // 9. 使用 remove(Object o) 按元素删除
        boolean isRemoved = studentList.remove("李四");  // 删除李四
        System.out.println("是否成功删除李四: " + isRemoved);// false
        System.out.println("删除李四后: " + studentList);
        // 输出：删除李四后: [赵六, 钱七, 王五, 张三]

        // 10. 使用 subList(int fromIndex, int toIndex) 获取子列表
        // 添加更多学生用于演示子列表
        studentList.add("孙八");
        studentList.add("周九");
        studentList.add("吴十");
        System.out.println("添加更多学生后: " + studentList);
        // 输出：添加更多学生后: [赵六, 钱七, 王五, 张三, 孙八, 周九, 吴十]

        // 获取索引1到4的子列表（包含1，不包含4）
        List<String> subList = studentList.subList(1, 4);
        System.out.println("子列表[1,4): " + subList);
        // 输出：子列表[1,4): [钱七, 王五, 张三]

        // 11. 使用 clear() 清空列表
        System.out.println("\n清空前的列表大小: " + studentList.size());
        studentList.clear();  // 清空所有元素
        System.out.println("清空后的列表: " + studentList);
        System.out.println("清空后的列表大小: " + studentList.size());
        /*输出
            清空前的列表大小: 7
            清空后的列表: []
            清空后的列表大小: 0
        */
    }
}